package ouhenry.stage.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * Redis 序列化配置，将使得Redis工具看到真实的数据，但是由此引来的问题便是，在Redis对象转为Java对象的时候不能强制类型转换，即便存储的时候直接存入实体对象。
 * @author Ou Henry
 *
 */
@Configuration
public class RedisConfig {
     @Bean
     @SuppressWarnings("all")
     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
           RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
           template.setConnectionFactory(factory);
           Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
           ObjectMapper om = new ObjectMapper();
           om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
           om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
           jackson2JsonRedisSerializer.setObjectMapper(om);
           StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
           template.setKeySerializer(stringRedisSerializer);// key采用String的序列化方式
           template.setHashKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式
           template.setValueSerializer(jackson2JsonRedisSerializer); // value序列化方式采用jackson
           template.setHashValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jackson
           template.afterPropertiesSet();
           return template;
     }
}